import requests, re
from . import tokens, message
from .models import Member
import time
from django.http import HttpResponse
# Create your views here.
# 登录，成功返回token令牌
userInfo = {}
def login(request):
    data = check_post(request, {'username', 'password'})
    if data['code'] == 0:
        return message.fail('请参考文档传递参数'+data['param'], 40003)
    elif data['code'] == 2:
        return message.fail('请检查提交方式或输入账号密码错误', 40001)
    elif data['code'] == 1:
        username = data['data']['username']
        password = data['data']['password']
        try:
            res = Member.objects.get(phone=username)
        except Member.DoesNotExist:
            return message.fail('用户不存在', 40005)

        if username == res.phone and password == res.pwd:
           token = tokens.create_access_token({'username': res.phone, 'password': res.pwd, 'openid': ''})
           return message.success({'token': token}, '登录成功')
        else:
            return message.fail('请检查提交方式或输入账号密码错误', 40001)
    else:
        return message.fail('请检查提交方式或输入账号密码错误', 40001)


# 验证是否post方式请求
def check_post(request, param):
    if request.method == 'POST':
        data = request.POST
        for item in param:
            if item not in data.keys():
               return {'code': 0, 'param': item}
        return {'code': 1, 'data': request.POST}
    else:
        return {'code': 2}

def get_url(request):
    data = check_post(request, {'token', 'url'})
    if data['code'] == 0:
        return message.fail('请参考文档传递参数' + data['param'], 40003)
    elif data['code'] == 2:
        return message.fail('请检查提交方式或输入账号密码错误', 40001)
    elif data['code'] == 1:
        ret = tokens.token_to_sub(data['data']['token'])
        if ret == 'fail':
            return message.fail('无效token', 40002)
        elif ret == 'timeout':
            return message.fail('token已过期', 40003)
        url = data['data']['url']
        if url.find('v.douyin.com/') == -1:  # 判断一下用户输入的是不是抖音链接
            return message.fail('您输入的不是抖音链接，应该是包含“v.douyin.com/”的链接形式！', 40004)  # 如果不是，就提示
        else:
            res = take_video(url)  # 如果是，就运行上面的名字叫做take_video的函数，并且把返回内容保存在http_的变量里
            return message.success(res, '成功获取！')

# 获取无水印链接
def take_video(http_):  # _函数开始，一个名字叫做http_的参数
    headers = {  # 这里先设置一下协议头，因为需要手机的协议头来获取地址
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Mobile Safari/537.36'
    }
    bake_http = requests.get(http_, headers=headers,
                             allow_redirects=False)  # get用户输入的网址，提交协议头，并且把allow_redirects设置为False来禁止重定向
    regular_bake = re.findall(r'/video/(\d*)', bake_http.text, flags=re.M)  # 正则一下返回的文本，取出/video/后面的ID；\d*来表示0或者多个数字
    if regular_bake == None:  # 判断一下正则有没有成功，因为正则失败的话会返回一个None，不判断的话正则失败程序就会报错
        return '链接解析失败，失败位置:第一步'  # 如果没有成功，就返回失败，来提示第几步失败了
    else:
        bake_id = regular_bake[0]  # 成功的话就取出来正则的第一个匹配项，复制给变量ID；正则失败的话调用这个就会报错的！所以上面判断一下
    bake_http = requests.get('https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=' + bake_id,
                             headers=headers, allow_redirects=False)
    # 拼接一下取出来的ID，继续提交协议头和禁止重定向
    works_name = bake_http.json()['item_list'][0]['desc']  # 取出来返回Json格式中的作品名字，赋值给变量
    works_nickname = bake_http.json()['item_list'][0]['author']['nickname']  # 取出来返回Json格式中的作者名字，赋值给变量
    works_music = bake_http.json()['item_list'][0]['music']['play_url']['uri']  # 取出来返回Json格式中的作品音乐，赋值给变量
    if works_music == '':  # 这里判断一下作品的音乐是不是空白
        works_music = '原声';  # 如果是空白的话就代表作品用的自己录制的声音，就是原声
    works_pic = bake_http.json()['item_list'][0]['video']['cover']['url_list'][0]  # 取出来返回Json格式中的作品封面图片，赋值给变量
    works_video_url = str(
        bake_http.json()['item_list'][0]['video']['play_addr']['url_list'][0])  # 取出来返回Json格式中的视频URL，赋值给变量
    works_video_url = works_video_url.replace('/playwm/', '/play/')  # 把视频URL中的/playwm/替换为/play/
    bake_http = requests.get(works_video_url, headers=headers, allow_redirects=False)  # 替换视频URL之后就开始Get这个网址，提交协议头，禁止重定向
    works_video_url = bake_http.text  # 取出来返回的文本内容
    regular_bake = re.findall(r'[a-zA-z]+://[^\s]*', bake_http.text,
                              flags=re.M)  # 正则一下，取出来返回文本中的网址，[a-zA-z]+://[^\s]*来自精益编程助手
    if regular_bake == None:  # 同上，判断一下是否匹配失败
        return '链接解析失败，失败位置:第二步'  # 失败的话返回在第二步出错
    else:
        works_video_url = regular_bake[0]  # 成功的话就取出来第一个匹配项，就是无水印地址
    return {'work_name': works_name, 'work_nickname': works_nickname, 'work_pic': works_pic, 'work_music': works_music, 'work_video_url': works_video_url}
